import { get, has, defaults } from 'lodash-es'
import { usePagination } from './usePagination'
import { ref } from 'vue'

type keyPath = string | Array<string>

/**
 * 导出一个处理表格数据钩子函数
 * @param api api函数，用于获取数据
 * @param params 参数，可以是对象或函数
 * @param options 配置对象，包括路径和数据
 * @returns
 */
export function useTable<T>(
  // api函数，用于获取数据
  api: (params: any) => Promise<T>,
  // 参数，可以是对象或函数
  params?: object | (() => object),
  // 配置项，包括路径和数据
  options?: {
    path?: { data?: keyPath; total?: keyPath; page?: string; size?: string }
    immediate?: boolean
  }
) {
  // 设置默认配置项
  defaults(options, {
    path: { data: 'data', total: 'total', page: 'page', size: 'size' },
    immediate: false
  })

  // 使用usePagination函数，获取分页信息和设置总条数的方法
  const { pagination, setTotal } = usePagination((extraData?: object) =>
    extraData ? refresh(extraData) : refresh()
  )

  // 定义loading状态和data数据
  const loading = ref<boolean>(false)
  const data = ref<T[]>([])

  // 定义refresh函数，用于刷新数据
  const refresh = (extraData?: object | (() => object)) => {
    // 设置请求数据
    const requestData = {
      [options?.path?.page as string]: pagination?.current,
      [options?.path?.size as string]: pagination?.size
    }
    if (extraData) {
      if (typeof extraData === 'function') {
        Object.assign(requestData, extraData())
      } else {
        Object.assign(requestData, extraData)
      }
    }
    if (params) {
      if (typeof params === 'function') {
        Object.assign(requestData, params())
      } else {
        Object.assign(requestData, params)
      }
    }
    // 设置loading状态为true
    loading.value = true
    // 调用api函数获取数据
    return (
      api(requestData)
        .then((res) => {
          // 设置data数据
          data.value = get(res, options!.path?.data as string[], [])
          // 设置总条数
          setTotal(get(res, options!.path?.total!, 0))
          // 检查响应数据是否缺少所需字段
          if (
            !has(res, options!.path?.total!) ||
            !has(res, options!.path?.data!)
          ) {
            console.warn('useTable: 响应数据缺少所需字段！')
          }
        })
        // 设置loading状态为false
        .finally(() => {
          loading.value = false
        })
    )
  }
  // 返回data、refresh、pagination、loading
  return {
    data,
    refresh,
    pagination,
    loading
  }
}
